package com.project3;

import com.project3.annotations.DBTable;
import com.project3.annotations.SQLType;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;


public class CreatorTable {
	public static void main(String[] args) throws Exception {
		Class.forName("oracle.jdbc.OracleDriver");
		Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","a");
		PreparedStatement pstmt=null;
		
		CreatorTable ct=new CreatorTable();
		List<String> list=new ArrayList<String>();
		list.add("com.project3.bean.Product");
		List<String> sql=ct.getTableName(list);
		for(String s:sql){
			pstmt=con.prepareStatement(s);
			System.out.println(pstmt.execute());
		}
	}
	
	/**
	 * 根据给定的类，检索是否使用了DBTable注解，如果有返回其建表的语句
	 * @param className
	 * @return
	 */
	public List<String> getTableName(List<String> className){
		List<String> tableName=new ArrayList<String>();
		String sql="create table ";
		if(className!=null&&className.size()>0){
			for(String cn:className){
				try {
					Class<?> cl=Class.forName(cn); //根据类名加载类
					DBTable dbTable=cl.getAnnotation(DBTable.class);// 检索该类是否有DBTable注解
					if(dbTable!=null){ //如果有，则获取其名字
						sql+=dbTable.name()+"(";
						//生成所有的列信息
						sql = getFields(sql, cl);
						tableName.add(sql);
					}
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		}
		return tableName;
	}

	/**
	 * 根据给定的类，返回该类下的所有字段信息
	 * @param sql：要拼接在后面的sql语句
	 * @param cl：要搜索的类
	 * @return
	 */
	private String getFields(String sql, Class<?> cl) {
		for(Field fd:cl.getDeclaredFields()){ //循环类中所有的属性
			Annotation[] anns=fd.getDeclaredAnnotations();  //获取该属性上的域注解
			if(anns.length>0){ //如果该属性上有注解
				for(Annotation ans:anns){ //判断是不是SQLType类型的注解
					if(ans instanceof SQLType){
						SQLType sqlType=(SQLType)ans;
						sql+=fd.getName()+" "+sqlType.dbtype();
						
						if(sqlType.constraints().primaryKey()){ //如果是主键
							sql+=" primary key";
						}
						
						if(!sqlType.constraints().allownull()){ //如果不允许为空
							sql+="not null";
						}
						
						if(sqlType.constraints().unique()){ //如果唯一则
							sql+=" unique";
						}
						sql+=",";
					}
				}
			}
		}
		sql=sql.substring(0,sql.lastIndexOf(","))+")";
		return sql;
	}
}
